package pruebas;

import java.util.ArrayList;

import juego.AvionCivil;
import juego.Avioneta;
import juego.Bombardero;
import juego.Botin;
import juego.Caza;
import juego.Cohete;
import juego.Coordenada;
import juego.Energia;
import juego.Explorador;
import juego.Impacto;
import juego.Laser;
import juego.Movil;
import juego.Torpedo;
import juego.TorpedoRastreador;
import juego.Vehiculo;
import junit.framework.TestCase;

public class TestBombardero extends TestCase {

	public void testColision(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Bombardero exp = new Bombardero(0,0);
		
		Coordenada coordH2 = new Coordenada(5,5);
		Torpedo h2 = new Torpedo(coordH2);
		
		Coordenada coordH3 = new Coordenada(15,15);
		Torpedo h3 = new Torpedo(coordH3);
		
		h2.hacerLeal();
		h3.hacerLeal();
		
		listaDeObjetos.add(exp);
		listaDeObjetos.add(h2);
		listaDeObjetos.add(h3);
		
		int puntaje = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertTrue(listaDeObjetos.contains(exp));
		assertFalse(listaDeObjetos.contains(h2));
		assertTrue(puntaje == 0);
		
		int puntaje2 = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertFalse(listaDeObjetos.contains(exp));
		assertFalse(listaDeObjetos.contains(h3));
		assertTrue(puntaje2 == 30);
	}
	

	public void testColisionFuerzaAmigo(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordExp = new Coordenada(0,0);
		Bombardero exp = new Bombardero(coordExp);
		
		Coordenada coordH2 = new Coordenada(5,5);
		Torpedo h2 = new Torpedo(coordH2);
		
		Coordenada coordH3 = new Coordenada(15,15);
		Torpedo h3 = new Torpedo(coordH3);
		
		listaDeObjetos.add(exp);
		listaDeObjetos.add(h2);
		listaDeObjetos.add(h3);
		
		int puntaje = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertTrue(listaDeObjetos.contains(exp));
		assertTrue(listaDeObjetos.contains(h2));
		assertTrue(puntaje == 0);
		
		int puntaje2 = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertTrue(listaDeObjetos.contains(exp));
		assertTrue(listaDeObjetos.contains(h3));
		assertTrue(puntaje2 == 0);
	}
	
	public void testDisparar() {
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordBombardero = new Coordenada(0,0);
		Bombardero bombardero = new Bombardero(coordBombardero);
		listaDeObjetos.add(bombardero);
		bombardero.vivir(listaDeObjetos,listaDeBotines);
		
		Movil unElemento1 = listaDeObjetos.get(1);
		Coordenada coord1 = unElemento1.verUbicacion();
		int x1 = coord1.obtenerCoordenadaX();
		int y1 = coord1.obtenerCoordenadaY();
		assertTrue(x1 == (4));
		assertTrue(y1 == (5));	
		
		Movil unElemento2 = listaDeObjetos.get(2);
		Coordenada coord2 = unElemento2.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (5));
		assertTrue(y2 == (5));	
		
		Movil unElemento3 = listaDeObjetos.get(3);
		Coordenada coord3 = unElemento3.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (6));
		assertTrue(y3 == (5));		
	
	}
	
	public void testDispararMuerto() {
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordExp = new Coordenada(0,0);
		Bombardero exp = new Bombardero(coordExp);
		listaDeObjetos.add(exp);
		exp.vivir(listaDeObjetos,listaDeBotines);
		
		Movil unElemento1 = listaDeObjetos.get(1);
		Coordenada coord1 = unElemento1.verUbicacion();
		int x1 = coord1.obtenerCoordenadaX();
		int y1 = coord1.obtenerCoordenadaY();
		assertTrue(x1 == (4));
		assertTrue(y1 == (5));		
		
		Movil unElemento2 = listaDeObjetos.get(2);
		Coordenada coord2 = unElemento2.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (5));
		assertTrue(y2 == (5));	
		
		Movil unElemento3 = listaDeObjetos.get(3);
		Coordenada coord3 = unElemento3.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (6));
		assertTrue(y3 == (5));	
		
	}
	
	public void testImpactoProvocado(){
		
		Movil movil = new Bombardero(0,8);
		Energia energia = new Energia(30);
		Impacto impacto = movil.impactoProvocado();
		impacto.herir(energia);
		assertEquals(10, energia.verEnergia());
		
	};	
	
	public void testMovimiento(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordH1 = new Coordenada(0,0);
		Bombardero h1 = new Bombardero(coordH1);
		listaDeObjetos.add(h1);
		
		h1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord1 = h1.verUbicacion();
		int x1 = coord1.obtenerCoordenadaX();
		int y1 = coord1.obtenerCoordenadaY();
		assertTrue(x1 == (5));
		assertTrue(y1 == (5));	
		
		for (int i=1;i<3;i++){
			h1.vivir(listaDeObjetos,listaDeBotines);}
		Coordenada coord2 = h1.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (15));
		assertTrue(y2 == (15));	
		
		h1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord3 = h1.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (10));
		assertTrue(y3 == (20));	
		
		for (int i=1;i<3;i++){
			h1.vivir(listaDeObjetos,listaDeBotines);}
		Coordenada coord4 = h1.verUbicacion();
		int x4 = coord4.obtenerCoordenadaX();
		int y4 = coord4.obtenerCoordenadaY();
		assertTrue(x4 == (0));
		assertTrue(y4 == (30));
		
		h1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord5 = h1.verUbicacion();
		int x5 = coord5.obtenerCoordenadaX();
		int y5 = coord5.obtenerCoordenadaY();
		assertTrue(x5 == (5));
		assertTrue(y5 == (35));
		
	}
	
	public void testProvocarHuida(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordNave = new Coordenada(0,0);
		Bombardero unaNave = new Bombardero(coordNave);
		unaNave.designarGuia();
		
		Coordenada coordTorpedoR = new Coordenada(5,5);
		TorpedoRastreador unTorpedoRastreador = new TorpedoRastreador(coordTorpedoR);
		
		Coordenada coordTorpedo = new Coordenada(5,7);
		Torpedo unTorpedo = new Torpedo(coordTorpedo);
		
		unTorpedoRastreador.hacerLeal();
		
		unTorpedo.hacerLeal();
		
		Coordenada coordEnemigo1 = new Coordenada(50,50);
		Explorador enemigo1 = new Explorador(coordEnemigo1);
		
		Coordenada coordEnemigo2 = new Coordenada(40,50);
		Caza enemigo2 = new Caza(coordEnemigo2);
		
		Coordenada coordEnemigo3 = new Coordenada(30,50);
		Avioneta enemigo3 = new Avioneta(coordEnemigo3);
		
		Coordenada coordEnemigo4 = new Coordenada(20,50);
		Bombardero enemigo4 = new Bombardero(coordEnemigo4);
	
		AvionCivil amigo1 = new AvionCivil(-100,-100);
		
		Coordenada coordAmigo2 = new Coordenada(100,100);
		Laser amigo2 = new Laser(coordAmigo2);
		amigo2.hacerLeal();
		
		Coordenada coordEnemigo5 = new Coordenada(10,50);
		Laser enemigo5 = new Laser(coordEnemigo5);
		
		listaDeObjetos.add(amigo1);
		listaDeObjetos.add(enemigo1);
		listaDeObjetos.add(enemigo3);
		listaDeObjetos.add(unTorpedoRastreador);
		listaDeObjetos.add(unaNave);
		listaDeObjetos.add(enemigo4);
		listaDeObjetos.add(enemigo5);
		listaDeObjetos.add(amigo2);
		listaDeObjetos.add(enemigo2);
		listaDeObjetos.add(unTorpedo);
		
		//Destruccion
		unaNave.vivir(listaDeObjetos,listaDeBotines);
		assertFalse(listaDeObjetos.contains(unaNave)); 
		assertFalse(listaDeObjetos.contains(unTorpedoRastreador)); 
		assertFalse(listaDeObjetos.contains(unTorpedo)); 
		
		//Huida
		//Siguen igual
		amigo1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord1 = amigo1.verUbicacion();
		int x1 = coord1.obtenerCoordenadaX();
		int y1 = coord1.obtenerCoordenadaY();
		assertTrue(x1 == (-95));
		assertTrue(y1 == (-100));
		
		amigo2.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord2 = amigo2.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (100));
		assertTrue(y2 == (90));
		
		enemigo5.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord3 = enemigo5.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (10));
		assertTrue(y3 == (60));
		
		//Huyen
		enemigo1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord4 = enemigo1.verUbicacion();
		int x4 = coord4.obtenerCoordenadaX();
		int y4 = coord4.obtenerCoordenadaY();
		assertTrue(x4 == (50));
		assertTrue(y4 == (40));
		
		enemigo2.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord5 = enemigo2.verUbicacion();
		int x5 = coord5.obtenerCoordenadaX();
		int y5 = coord5.obtenerCoordenadaY();
		assertTrue(x5 == (40));
		assertTrue(y5 == (47));
		
		enemigo3.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord6 = enemigo3.verUbicacion();
		int x6 = coord6.obtenerCoordenadaX();
		int y6 = coord6.obtenerCoordenadaY();
		assertTrue(x6 == (30));
		assertTrue(y6 == (35));
		
		enemigo4.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord7 = enemigo4.verUbicacion();
		int x7 = coord7.obtenerCoordenadaX();
		int y7 = coord7.obtenerCoordenadaY();
		assertTrue(x7 == (20));
		assertTrue(y7 == (45));
		
	}
	
	
	public void testDejarBotin(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada ubicacion = new Coordenada(0,0);
		Vehiculo movil = new Bombardero(ubicacion);
		assertEquals(0, listaDeBotines.size());
		
		Coordenada ubicacionLaser = new Coordenada(0,7);
		Laser laser = new Laser(ubicacionLaser);
		Coordenada ubicacionCohete = new Coordenada(1,10);
		Cohete cohete = new Cohete(ubicacionCohete);
		laser.hacerLeal();
		cohete.hacerLeal();
		Coordenada ubicacionCohete2 = new Coordenada(0,10);
		Cohete cohete2 = new Cohete(ubicacionCohete2);
		cohete2.hacerLeal();
		Torpedo torpedo = new Torpedo(ubicacionLaser);
		torpedo.hacerLeal();
		
		listaDeMoviles.add(laser);
		listaDeMoviles.add(movil);
		listaDeMoviles.add(cohete);
		listaDeMoviles.add(cohete2);
		listaDeMoviles.add(torpedo);
		
		//destruccion
		movil.vivir(listaDeMoviles,listaDeBotines);
		assertFalse(movil.estaVivo());
		assertEquals(1, listaDeBotines.size());
	}
	
}
